<?php

/**
 * 后台Controller
 */
namespace Common\Controller;
use Common\Controller\AppframeController;

class AdminbaseController extends AppframeController {

	public function __construct() {
	    hook('admin_begin');
		$admintpl_path=C("SP_ADMIN_TMPL_PATH").C("SP_ADMIN_DEFAULT_THEME")."/";
		C("TMPL_ACTION_SUCCESS",$admintpl_path.C("SP_ADMIN_TMPL_ACTION_SUCCESS"));
		C("TMPL_ACTION_ERROR",$admintpl_path.C("SP_ADMIN_TMPL_ACTION_ERROR"));
		parent::__construct();
		$time=time();
		$this->assign("js_debug",APP_DEBUG?"?v=$time":"");
	}

	function _initialize(){
	    parent::_initialize();

	    define("TMPL_PATH", C("SP_ADMIN_TMPL_PATH"));
	    
	    //暂时取消后台多语言
	    $this->load_app_admin_menu_lang();
	    
	    $session_admin_id=session('ADMIN_ID');
	    
    	if(!empty($session_admin_id)){
            $users_obj= M("Member");
    		$user=$users_obj->where(array('user_id'=>$session_admin_id))->find();
    		if(!$this->check_access($session_admin_id)){
				$this->error("您没有访问权限！");
			}
			$this->assign("admin",$user);
		}else{
            if(IS_AJAX){
				$this->error("您还没有登录！",U("admin/public/login"));
			}else{
				header("Location:".U("admin/public/login"));
				exit();
			}

		}
	}

	/**
	 * 初始化后台菜单
	 */
	public function initMenu() {
		$Menu = F("Menu");
		if (!$Menu) {
			$Menu=D("Common/Menu")->where(array("remark"=>1))->menu_cache();
		}
		return $Menu;
	}


    /**
     * 检查手机号码格式
     * @param $mobile 手机号码
     */
    protected function check_mobile($mobile){
        if(preg_match('/1[0123456789]\d{9}$/',$mobile))
            return true;
        return false;
    }

    /**
     * 检查邮箱地址格式
     * @param $email 邮箱地址
     * @return bool
     */
    protected function check_email($email){
        if(filter_var($email,FILTER_VALIDATE_EMAIL))
            return true;
        return false;
    }

    protected function set_encrypt($data, $key = 'asa')
    {
        $key    =    md5($key);
        $x        =    0;
        $len    =    strlen($data);
        $l        =    strlen($key);
        for ($i = 0; $i < $len; $i++)
        {
            if ($x == $l)
            {
                $x = 0;
            }
            $char .= $key{$x};
            $x++;
        }
        for ($i = 0; $i < $len; $i++)
        {
            $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);
        }
        return base64_encode($str);
    }


    function get_decrypt($data, $key = 'asa')
    {
        $key = md5($key);
        $x = 0;
        $data = str_replace(' ','+',$data);
        $data = base64_decode($data);
        $len = strlen($data);
        $l = strlen($key);
        for ($i = 0; $i < $len; $i++)
        {
            if ($x == $l)
            {
                $x = 0;
            }
            $char .= substr($key, $x, 1);
            $x++;
        }
        for ($i = 0; $i < $len; $i++)
        {
            if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1)))
            {
                $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
            }
            else
            {
                $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
            }
        }
        return $str;
    }

    public function create_png($text, $bool = false, $outfile = false, $level = 'H', $size = 10, $margin = 6, $saveandprint=false,$logopath,$store_name=null)
    {
        require_once '../promotion/simplewind/Core/Library/Vendor/phpqrcode/phpqrcode.php';
        $qrcode = new \QRcode();
        if ( $outfile ) {
            if (!file_exists(dirname($outfile))){
                mkdir(dirname($outfile),0777,true);
            }
            $result = $qrcode::png($text, $outfile, $level, $size, $margin, $saveandprint);
            $QR = file_get_contents($outfile);
        } else {
            ob_start();
            $qrcode::png($text, $outfile, $level, $size, $margin, $saveandprint);
            $QR = ob_get_contents();
            ob_end_clean();
        }

        //判断是否生成带logo的二维码
        if($bool)
        {
            $font = "/data/wwwroot/default/ecmall/promotion/public/font/msyh.ttc";
            //字体大小
            $size = 15;
            //显示的文字
            $string = $store_name;
            $num1 = $this->abslength($string)/2;
            $x1 = 301-$num1;
            $logo = imagecreate(600,100);
            $black = ImageColorAllocate($logo, 255, 255, 255);
            $black1 = ImageColorAllocate($logo, 0, 0, 0);

            imagefilledrectangle($logo,0,0,600,60,$black);
            $info = imagettftext($logo, $size, 0, $x1, 28, $black1, $font, $string);

            $QR = imagecreatefromstring(file_get_contents($outfile));    //目标图象连接资源。
            $QR_width = imagesx($QR);      //二维码图片宽度
            $QR_height = imagesy($QR);     //二维码图片高度
            $logo_width = imagesx($logo);    //logo图片宽度
            $logo_height = imagesy($logo);   //logo图片高度


            $logo_qr_width = $QR_width;   //组合之后logo的宽度(占二维码的1/5)
            $scale = $logo_width / $logo_qr_width;  //logo的宽度缩放比(本身宽度/组合后的宽度)
            $logo_qr_height = $logo_height / $scale; //组合之后logo的高度
            $from_width = ($QR_width - $logo_qr_width) / 2;  //组合之后logo左上角所在坐标点
            imagecopyresampled($QR, $logo, 0, 600, 0, 0, 580, 100, 600, 100);

            //输出图片
            imagepng($QR, $outfile);
            imagedestroy($QR);
            imagedestroy($logo);
        }
        return $outfile;
    }

    function _upload($pash){
        require_once '../includes/aliyunOss/samples/Common.php';
        $ossClient = new \common;
        $r = $ossClient->putObjectFile('../'.$pash,$pash);
        if(!$r['info'] || $r['info']['http_code'] != 200){
            return false;
        }
        unlink('../'.$pash);
        return true;
    }


    function abslength($s){
        $n = 0;
        preg_match_all("/./us",$s,$matchs);
        foreach($matchs[0] as $p){
            $n += preg_match('#^['.chr(0x1).'-'.chr(0xff).']$#',$p) ? 1 : 2;
        }
        return $n;
    }

    /**
     * 获得系统年份数组
     */
    function getSystemYearArr() {
        $year_arr = array('2010' => '2010', '2011' => '2011', '2012' => '2012', '2013' => '2013', '2014' => '2014', '2015' => '2015', '2016' => '2016', '2017' => '2017', '2018' => '2018', '2019' => '2019', '2020' => '2020');
        return $year_arr;
    }

    /**
     * 获得系统月份数组
     */
    function getSystemMonthArr() {
        $month_arr = array('1' => '01', '2' => '02', '3' => '03', '4' => '04', '5' => '05', '6' => '06', '7' => '07', '8' => '08', '9' => '09', '10' => '10', '11' => '11', '12' => '12');
        return $month_arr;
    }

    /**
     * 获得系统周数组
     */
    function getSystemWeekArr() {
        $week_arr = array('1' => '周一', '2' => '周二', '3' => '周三', '4' => '周四', '5' => '周五', '6' => '周六', '7' => '周日');
        return $week_arr;
    }

    /**
     * 获取某月的最后一天
     */
    function getMonthLastDay($year, $month) {
        $t = mktime(0, 0, 0, $month + 1, 1, $year);
        $t = $t - 60 * 60 * 24;
        return $t;
    }

    /**
     * 获得系统某月的周数组，第一周不足的需要补足
     */
    function getMonthWeekArr($current_year, $current_month) {
        //该月第一天
        $firstday = strtotime($current_year . '-' . $current_month . '-01');
        //该月的第一周有几天
        $firstweekday = (7 - date('N', $firstday) + 1);
        //计算该月第一个周一的时间
        $starttime = $firstday - 3600 * 24 * (7 - $firstweekday);
        //该月的最后一天
        $lastday = strtotime($current_year . '-' . $current_month . '-01' . " +1 month -1 day");
        //该月的最后一周有几天
        $lastweekday = date('N', $lastday);
        //该月的最后一个周末的时间
        $endtime = $lastday - 3600 * 24 * $lastweekday;
        if($lastweekday == 7){
            $endtime = $lastday;
        }
        $step = 3600 * 24 * 7; //步长值
        $week_arr = array();
        for ($i = $starttime; $i < $endtime; $i = $i + 3600 * 24 * 7) {
            $week_arr[] = array('key' => date('Y-m-d', $i) . '|' . date('Y-m-d', $i + 3600 * 24 * 6), 'val' => date('Y-m-d', $i) . '~' . date('Y-m-d', $i + 3600 * 24 * 6));
        }
        return $week_arr;
    }
    /**
     * 处理搜索时间
     */
    function dealwithSearchTime($search_arr) {
        //初始化时间
        //天
        if (!$search_arr['search_time']) {
            $search_arr['search_time'] = date('Y-m-d', time());
        }
        $search_arr['day']['search_time'] = strtotime($search_arr['search_time']); //搜索的时间
        //周
        if (!$search_arr['searchweek_year']) {
            $search_arr['searchweek_year'] = date('Y', time());
        }
        if (!$search_arr['searchweek_month']) {
            $search_arr['searchweek_month'] = date('m', time());
        }
        if (!$search_arr['searchweek_week']) {
            $search_arr['searchweek_week'] = implode('|', $this->getWeek_SdateAndEdate(time()));
        }
        $weekcurrent_year = $search_arr['searchweek_year'];
        $weekcurrent_month = $search_arr['searchweek_month'];
        $weekcurrent_week = $search_arr['searchweek_week'];
        $search_arr['week']['current_year'] = $weekcurrent_year;
        $search_arr['week']['current_month'] = $weekcurrent_month;
        $search_arr['week']['current_week'] = $weekcurrent_week;

        //月
        if (!$search_arr['searchmonth_year']) {
            $search_arr['searchmonth_year'] = date('Y', time());
        }
        if (!$search_arr['searchmonth_month']) {
            $search_arr['searchmonth_month'] = date('m', time());
        }
        $monthcurrent_year = $search_arr['searchmonth_year'];
        $monthcurrent_month = $search_arr['searchmonth_month'];
        $search_arr['month']['current_year'] = $monthcurrent_year;
        $search_arr['month']['current_month'] = $monthcurrent_month;
        return $search_arr;
    }
    /**
     * 获取本周的开始时间和结束时间
     */
    function getWeek_SdateAndEdate($current_time) {
        $current_time = strtotime(date('Y-m-d', $current_time));
        $return_arr['sdate'] = date('Y-m-d', $current_time - 86400 * (date('N', $current_time) - 1));
        $return_arr['edate'] = date('Y-m-d', $current_time + 86400 * (7 - date('N', $current_time)));
        return $return_arr;
    }

    public function getCurl($url){
        $info=curl_init();
        curl_setopt($info,CURLOPT_RETURNTRANSFER,true);
        curl_setopt($info,CURLOPT_HEADER,0);
        curl_setopt($info,CURLOPT_NOBODY,0);
        curl_setopt($info,CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($info,CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($info,CURLOPT_URL,$url);
        $output= curl_exec($info);
        curl_close($info);
        return $output;
    }

    function postCurl($url,$data)
    {
        $ch = curl_init();
        $header = "Accept-Charset: utf-8";
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
        if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) {
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        }
        curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $tmpInfo = curl_exec($ch);
        if (curl_errno($ch)) {
            return false;
        }else{
            return $tmpInfo;
        }
    }


    /**
	 * 消息提示
	 * @param type $message
	 * @param type $jumpUrl
	 * @param type $ajax
	 */
	public function success($message = '', $jumpUrl = '', $ajax = false) {
		parent::success($message, $jumpUrl, $ajax);
	}

    /**
     * 模板显示
     * @param string $templateFile 指定要调用的模板文件
     * @param string $charset 输出编码
     * @param string $contentType 输出类型
     * @param string $content 输出内容
     * 此方法作用在于实现后台模板直接存放在各自项目目录下。例如Admin项目的后台模板，直接存放在Admin/Tpl/目录下
     * @param string $prefix
     * @throws \Think\Exception
     */
    protected function display($templateFile = '', $charset = '', $contentType = '', $content = '', $prefix = '') {
        parent::display($this->parseTemplate($templateFile), $charset, $contentType,$content,$prefix);
	}

    /**
     * 获取输出页面内容
     * 调用内置的模板引擎fetch方法，
     * @access protected
     * @param string $templateFile 指定要调用的模板文件
     * 默认为空 由系统自动定位模板文件
     * @param string $content 模板输出内容
     * @param string $prefix 模板缓存前缀*
     * @return string
     * @throws \Think\Exception
     */
    protected function fetch($templateFile='',$content='',$prefix=''){
		$templateFile = empty($content)?$this->parseTemplate($templateFile):'';
		return parent::fetch($templateFile,$content,$prefix);
	}

    /**
     * 自动定位模板文件
     * @access protected
     * @param string $template 模板文件规则
     * @return string
     * @throws \Think\Exception
     */
    protected function parseTemplate($template='') {
		$tmpl_path=C("SP_ADMIN_TMPL_PATH");
		define("SP_TMPL_PATH", $tmpl_path);
    	if($this->theme) { // 指定模板主题
    	    $theme = $this->theme;
    	}else{
    	    // 获取当前主题名称
    	    $theme      =    C('SP_ADMIN_DEFAULT_THEME');
    	}

		if(is_file($template)) {
			// 获取当前主题的模版路径
			define('THEME_PATH',   $tmpl_path.$theme."/");
			return $template;
		}
		$depr       =   C('TMPL_FILE_DEPR');
		$template   =   str_replace(':', $depr, $template);

		// 获取当前模块
		$module   =  MODULE_NAME."/";
		if(strpos($template,'@')){ // 跨模块调用模版文件
			list($module,$template)  =   explode('@',$template);
		}

		$module =$module."/";

		// 获取当前主题的模版路径
		define('THEME_PATH',   $tmpl_path.$theme."/");

		// 分析模板文件规则
		if('' == $template) {
			// 如果模板文件名为空 按照默认规则定位
			$template = CONTROLLER_NAME . $depr . ACTION_NAME;
		}elseif(false === strpos($template, '/')){
			$template = CONTROLLER_NAME . $depr . $template;
		}

		$cdn_settings=sp_get_option('cdn_settings');
		if(!empty($cdn_settings['cdn_static_root'])){
		    $cdn_static_root=rtrim($cdn_settings['cdn_static_root'],'/');
		    C("TMPL_PARSE_STRING.__TMPL__",$cdn_static_root."/".THEME_PATH);
		    C("TMPL_PARSE_STRING.__PUBLIC__",$cdn_static_root."/public");
		    C("TMPL_PARSE_STRING.__WEB_ROOT__",$cdn_static_root);
		}else{
		    C("TMPL_PARSE_STRING.__TMPL__",__ROOT__."/".THEME_PATH);
		}
		

		C('SP_VIEW_PATH',$tmpl_path);
		C('DEFAULT_THEME',$theme);
		define("SP_CURRENT_THEME", $theme);

		$file = sp_add_template_file_suffix(THEME_PATH.$module.$template);
		$file= str_replace("//",'/',$file);
		if(!file_exists_case($file)) E(L('_TEMPLATE_NOT_EXIST_').':'.$file);
		return $file;
    }

    /**
     * 排序 排序字段为listorders数组 POST 排序字段为：listorder或者自定义字段
     * @param mixed $model 需要排序的模型类
     * @param string $custom_field 自定义排序字段 默认为listorder,可以改为自己的排序字段
     * @return bool
     */
    protected function _listorders($model,$custom_field='') {
        if (!is_object($model)) {
            return false;
        }
        $field=empty($custom_field)&&is_string($custom_field)?'listorder':$custom_field;
        $pk = $model->getPk(); //获取主键名称
        $ids = $_POST['listorders'];
        foreach ($ids as $key => $r) {
            $data[$field] = $r;
            $model->where(array($pk => $key))->save($data);
        }
        return true;
    }

	/**
	 * 
	 * {@inheritDoc}
	 * @see \Common\Controller\AppframeController::page()
	 */
	protected function page($total_size = 1, $page_size = 0, $current_page = 1, $listRows = 6, $pageParam = '', $pageLink = '', $static = false) {
		if ($page_size == 0) {
			$page_size = C("PAGE_LISTROWS");
		}

		if (empty($pageParam)) {
			$pageParam = C("VAR_PAGE");
		}

		$page = new \Page($total_size, $page_size, $current_page, $listRows, $pageParam, $pageLink, $static);
        $page->SetPager('Admin', '{first}{prev}&nbsp;{liststart}{list}&nbsp;{next}{last}<span>共{recordcount}条数据</span>', array("listlong" => "4", "first" => "首页", "last" => "尾页", "prev" => "上一页", "next" => "下一页", "list" => "*", "disabledclass" => ""));
		return $page;
	}

	/**
	 *  检查后台用户访问权限
	 * @param int $uid 后台用户id
	 * @return boolean 检查通过返回true
	 */
	private function check_access($uid){
		//如果用户角色是1，则无需判断
		if($uid == 1){
			return true;
		}

		$rule=MODULE_NAME.CONTROLLER_NAME.ACTION_NAME;
		$no_need_check_rules=array("AdminIndexindex","AdminMainindex");

		if( !in_array($rule,$no_need_check_rules) ){
			return sp_auth_check($uid);
		}else{
			return true;
		}
	}

	/**
	 * 加载后台用户语言包
	 */
    private function load_app_admin_menu_lang(){
	    $default_lang=C('DEFAULT_LANG');
	    $langSet=C('ADMIN_LANG_SWITCH_ON',null,false)?LANG_SET:$default_lang;
		if($default_lang!=$langSet){
		    $admin_menu_lang_file=SPAPP.MODULE_NAME."/Lang/".$langSet."/admin_menu.php";
		}else{
		    $admin_menu_lang_file=SITE_PATH."data/lang/".MODULE_NAME."/Lang/$langSet/admin_menu.php";
		    if(!file_exists_case($admin_menu_lang_file)){
		        $admin_menu_lang_file=SPAPP.MODULE_NAME."/Lang/".$langSet."/admin_menu.php";
		    }
		}
		if(is_file($admin_menu_lang_file)){
			$lang=include $admin_menu_lang_file;
			L($lang);
    	}
    }

    /**
     *  根据条件进行搜索用户列表
     * @param $where
     * @return array
    */
    protected function memberListWhere($where,$order=null){
        return D("member")->where($where)->order($order)->select();
    }
}